#ifndef MUSICPLAYER25A_H
#define MUSICPLAYER25A_H

#include <QWidget>
#include <QMediaPlayer>
#include <QMediaMetaData>
#include <QAudioOutput>
#include <QFileDialog>
#include <QDirIterator>
#include <QRandomGenerator>

#include "Playlist.h"
//#include "Shuffle.hpp"

QT_BEGIN_NAMESPACE
namespace Ui {
class MusicPlayer25A;
}
QT_END_NAMESPACE

class MusicPlayer25A : public QWidget
{
    Q_OBJECT

public:
    MusicPlayer25A(QWidget *parent = nullptr);
    ~MusicPlayer25A();

private slots:
    void on_btnOpenDir_clicked();
    void on_btnPlayPause_clicked();
    void on_btnStop_clicked();
    void on_lisTrack_doubleClicked(const QModelIndex &index);
    void on_sliDur_sliderPressed();
    void on_sliDur_sliderReleased();
    void on_sliDur_sliderMoved(int position);
    void on_btnNextTrack_clicked();
    void on_btnPrevTrack_clicked();
    void on_btnPlayOrder_clicked();

    void on_btnVolume_clicked();

private:
    Ui::MusicPlayer25A *ui;
    Playlist *playlist;
    QString latestDir; // 上次打开的目录
    // QList<int> *shuffledTrackNoList; // 用于随机播放的音轨号列表

    QAudioOutput *mainAudioOutput{}; // {} 代表值初始化为 nullptr
    QAudioOutput *viceAudioOutput{};
    QMediaPlayer *mainPlayer{}; // 主播放器
    QMediaPlayer *vicePlayer{}; // 副播放器
    QMediaPlayer::PlaybackState prevPlaybackState; // 上一个播放状态
    bool doPreloading = true; // 是否要做预加载
    bool isPreloaded = false; // 是否完成预加载
    bool isInitedConnection = false; // 是否初始化信号连接

    void switchToConnectMainPlayer(); // 连接主副播放器
    void preloadNextTrack(); // 预加载下一个音轨
    void switchMainPlayer(); // 切换主播放器
    void handleMetaDataChanged();
    void handleMediaStatusChanged(QMediaPlayer::MediaStatus status);
    void handlePlaybackStateChanged(QMediaPlayer::PlaybackState state);

    void loadTracksFromDir(const QString &dir); // 从传入目录加载音轨

    bool is_sliDur_UserDragging = false; // 用户是否正在拖动进度条
    bool is_sliDur_ReleasedToResume = true; // 用户松开进度条后是否恢复播放
    int sliDur_Threshold = 50; // 进度条防微小抖动阈值
    int gaplessThreshold = 100; // 无缝播放切歌阈值
    qint64 prevTrackPos; // 用户手动改变进度前的上一个播放位置

    // qint64 curTrackDur = 0; // 当前音轨时长
    int curTrackCount = 0;  // 当前音轨总数
    int curTrackNo = -1;    // 当前音轨索引
    Track *curTrack;        // 当前播放音轨

    enum PlayOrder {
        Sequential, // 顺序播放
        LoopList,   // 列表循环
        LoopSingle, // 单曲循环
        Shuffle     // 随机播放
    };
    PlayOrder arrPlayOrder[4] = {Sequential, LoopList, LoopSingle, Shuffle};
    QString arrPlayOrderText[4] = {"顺序播放", "列表循环", "单曲循环", "随机播放"};
    int lenPlayOrder = sizeof(arrPlayOrder) / sizeof(arrPlayOrder[0]);
    int curPlayOrderIndex = 0;
    PlayOrder curPlayOrder = arrPlayOrder[curPlayOrderIndex];
    QString playOrderIconFilename[4] = {"sequential","looplist","loopsingle","shuffle"};
    QString curPlayOrderIconPath = ":/icons/" + playOrderIconFilename[curPlayOrder] + ".png";
    int nextTrackNo(); // 返回当前下一个音轨的索引
    int prevTrackNo(); // 返回当前上一个音轨的索引

    void showMetaData(Track *track); // 显示音频元数据
    void showDuration(qint64 dur); // 显示音频时长
    void showPosition(qint64 pos); // 显示播放位置
    void playPlaylistAt(int no); // 播放播放列表中特定索引的音轨
    void pauseMainPlayer();
    void resumeMainPlayer();
    void stopMainPlayer();
    void playNextTrack();
    void playPrevTrack();
};
#endif // MUSICPLAYER25A_H
